// compile:
// run:
#include <iostream>
#include <iterator>
#include <list>
#include <vector>

using namespace std;

// 仿函数
template <typename T>
class Add {
 public:
  T operator()(const T& t1, const T& t2) { return t1 + t2; }
};
void Test1() {
  Add<int> int_adder;
  cout << int_adder(3, 5) << endl;
}
// 分配器
// TODO:分配器实现，主要就是实现四个核心函数
class XXX {
 public:
  XXX(int a, double b) : a_(a), b_(b) { cout << "XXX construct" << endl; }
  ~XXX() noexcept { cout << "XXX deconstruct" << endl; }

 private:
  int a_;
  double b_;
};
void Test2() {
  allocator<XXX> alloc;
  int size = sizeof(XXX);
  XXX* ptr = alloc.allocate(size);  // 内存分配
  alloc.construct(ptr, 3, 0.54);    // 对象构造
  cout << "内存分配、对象构造完毕" << endl;
  alloc.destroy(ptr);           // 对象析构
  alloc.deallocate(ptr, size);  // 内存释放
}
// 适配器
void Test3() {
  // 容器适配器
  // 迭代器适配器，逆序打印链表
  std::list<int> l{1, 2, 3, 4, 5};
  std::reverse_iterator<std::list<int>::iterator> begin = l.rbegin();
  std::reverse_iterator<std::list<int>::iterator> end = l.rend();
  for (; begin != end; ++begin) {
    cout << *begin << " ";
  }
  cout << endl;

  // 仿函数适配器
}
// 容器
void Test4() {}
// 迭代器
void Test5() {}
// 算法
void Test6() {}
int main() {
  // Test1();
  // Test2();
  Test3();
  //   Test2();
  //   Test2();
  //   Test2();
  //   Test2();
  return 0;
}
// TODO:sizeof 与 通过模板计算数组长度区别？
